// 快速排列法
// 思想：取出一个中间数，比这个数大的放右边，比这个数大的放左边。
//       然后左边数据递归，拼上中间数，再拼上右边数组递归。
function quickSort<T>(arr: Array<T>): Array<T> {
  if (arr.length <= 1) { return arr }
  let mid = Math.floor((arr.length) / 2)
  let midNum = arr.splice(mid, 1)
  let left: Array<T> = []
  let right: Array<T> = []
  arr.forEach(item => {
    if (item > midNum) {
      right.push(item)
    } else {
      left.push(item)
    }
  })

  return quickSort(left).concat(midNum, quickSort(right))
}

// 让函数能排序number[]，与英文字符串。
function strSort(str: string): string {
  let strArr = str.split('')
  return quickSort(strArr).join('')
}

function sort<T extends number>(data: Array<T>): Array<T>;  // 泛型重载签名
function sort(data: string): string;
function sort<T extends number>(data: Array<T> | string): Array<T> | string {
  if (data instanceof Array) {
    return quickSort(data)
  } else {
    return strSort(data)
  }
}

let arr = [1, 8, 8, 8.8, 2, 3, 10, 6, 55, 43, 66]
let str = 'bapjom'
console.log(sort(arr))
console.log(sort(str))  // abjmop
export {}
